Programmers developing computer applications desire to write applications, also known as programs, with minimal errors. Accordingly, a wide range of programming tools have evolved to detect various types of errors in applications of various types. Errors may be detected statically, by analyzing source code, without the need to execute the program. For example, compilers typically detect syntax errors in source code while compiling. Other static analysis tools, such as lint, scan source code for patterns likely to result in errors, such as infinite loops and common programming errors.
Other errors may be detected dynamically i.e., during executing the application, also known as during run time. Programming libraries, such as the C Runtime Library include trace( ) and assert( ) functions to provide run time checks while running in debug mode. The trace( ) function performs an indication that a particular portion of source code has been executed. The assert( ) function performs precondition checks.
Trace points and other break points for run time testing of applications, may be inserted by tools dynamically. For example debuggers allow for the insertion of debug points such that the program and potentially to perform some function for the programmer. Profilers may insert trace points to measure execution speed and other performance metrics during run time.
However, prior art tools are typically directed towards a monolithic architecture, where an application is written almost solely in a single language. Present day applications generally are not effectively tested with prior tools because present day applications are typically distributed across multiple layers, and servers often in different localities. For example, a mobile device may run an HTML web page with some JavaScript for a client layer, which calls a Java applet on an application server miles away comprising a customer server or business logic layer, which in turn calls resources in a resource layer in the form of a Structured Query Language (SQL) based database and a NoSQL (non-SQL) based database. Accordingly, not only are there different application layers to be traversed, but each layer may be programmed with a mix of programming languages, each with their own respective grammar, thereby increasing complexity.
Furthermore, run time metrics are different from those measured with prior art tools. For example performance for a distributed application will relate to performance of the entire application rather than for a layer or object in the application. Other metrics, not addressed by prior art tools have arisen in importance such as application health, security and usability.